package com.slwish.xty.base;

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Environment;
import android.os.StrictMode;
import android.support.multidex.MultiDex;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.mapapi.SDKInitializer;
import com.mob.MobSDK;
import com.slwish.common.base.CommonApplication;
import com.slwish.common.utils.ScreenUtils;
import com.slwish.xty.R;
import com.slwish.xty.config.UrlConfig;
import com.slwish.xty.ui.activity.MainActivity;
import com.slwish.xty.utils.LocaServiceUtils;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;
import com.tencent.bugly.beta.UpgradeInfo;
import com.tencent.bugly.beta.interfaces.BetaPatchListener;
import com.tencent.bugly.beta.ui.UILifecycleListener;
import com.zhouyou.http.EasyHttp;
import com.zhouyou.http.cache.converter.SerializableDiskConverter;
import com.zhouyou.http.cache.model.CacheMode;

import org.litepal.LitePal;

/**
 * 模块说明：
 *
 * @author 陈浩
 * @date 2017/11/28
 */

public class BaseApplication extends CommonApplication {
    public static double Latitude;//纬度
    public static double Longitude;//经度
    private static final String BUGLY_APP_KEY = "3cbf66b729";
    private static LocaServiceUtils locaServiceUtils;
    private static final String TAG = "BaseApplication";

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // you must install multiDex whatever tinker is installed!
        MultiDex.install(base);
        // 安装tinker
        Beta.installTinker();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
        //分享功能初始化
        MobSDK.init(this, "234ae546d4208", "b7d81d31274e0230afcd12f53fe1f6e2");
        //在使用SDK各组件之前初始化context信息，传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        //百度地图初始化
        SDKInitializer.initialize(getApplicationContext());
        initEasyHttp();
        locaServiceUtils = new LocaServiceUtils(this);
        locaServiceUtils.start();
        locaServiceUtils.registerListener(new BDAbstractLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation bdLocation) {

                if (bdLocation != null) {
                    Latitude = bdLocation.getLatitude();
                    Longitude = bdLocation.getLongitude();

                }
                locaServiceUtils.stop();
            }
        });
//        LoadSir.beginBuilder()
//                .addCallback(new EmptyCallback())
//                .addCallback(new TimeoutCallback())
//                .addCallback(new LoadingCallback())
//                .setDefaultCallback(LoadingCallback.class)
//                .commit();
        //Bugly初始化
        // 这里实现SDK初始化，appId替换成你的在Bugly平台申请的appId
        // 调试时，将第三个参数改为tru
        initBuglyUpload();
        initBugly();

    }

    public static LocaServiceUtils getLocaService() {
        return locaServiceUtils;
    }

    private void initEasyHttp() {
        EasyHttp.init(this);
        EasyHttp.getInstance()
                .setBaseUrl(UrlConfig.HOST_URL)//设置全局URL
                .debug("EasyHttp", true)
                .setReadTimeOut(15 * 1000)
                .setWriteTimeOut(15 * 100)
                .setConnectTimeout(15 * 100)
                .setRetryCount(3)//网络不好自动重试3次
                .setRetryDelay(1000)//每次延时500ms重试
                .setRetryIncreaseDelay(500)//每次延时叠加500ms
                .setCacheMode(CacheMode.NO_CACHE)
                .setCacheTime(-1)//-1表示永久缓存,单位:秒 ，Okhttp和自定义RxCache缓存都起作用
                .setCacheDiskConverter(new SerializableDiskConverter())//默认缓存使用序列化转化
                .setCacheMaxSize(100 * 1024 * 1024)//设置缓存大小为100M
                .setCacheVersion(1);//缓存版本为1
    }

    /**
     * 初始化bugly升级
     */
    private void initBuglyUpload() {
        //自动检查更新开关
        Beta.autoCheckUpgrade = true;
        //true表示初始化时自动检查升级; false表示不会自动检查升级,需要手动调用Beta.checkUpgrade()方法;
        //升级检查周期设置
        Beta.upgradeCheckPeriod = 600 * 1000;
        //设置升级检查周期为60s(默认检查周期为0s)，60s内SDK不重复向后台请求策略);
        //延迟初始化
//        Beta.initDelay = 1 * 1000;
        //设置启动延时为1s（默认延时3s），APP启动1s后初始化SDK，避免影响APP启动速度;
        //设置通知栏大图标
        Beta.largeIconId = R.mipmap.ic_launcher;
        //largeIconId为项目中的图片资源;
        //设置状态栏小图标
        Beta.smallIconId = R.mipmap.ic_launcher;
        //smallIconId为项目中的图片资源id
        //设置更新弹窗默认展示的banner
        Beta.defaultBannerId = R.mipmap.ic_launcher;
        //defaultBannerId为项目中的图片资源Id; 当后台配置的banner拉取失败时显示此banner，默认不设置则展示“loading...“;
        //设置sd卡的Download为更新资源存储目录
        Beta.storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        //后续更新资源会保存在此目录，需要在manifest中添加WRITE_EXTERNAL_STORAGE权限;
        //设置开启显示打断策略
        Beta.showInterruptedStrategy = true;
        //设置点击过确认的弹窗在App下次启动自动检查更新时会再次显示。
        //添加可显示弹窗的Activity
        Beta.canShowUpgradeActs.add(MainActivity.class);
        //例如，只允许在MainActivity上显示更新弹窗，其他activity上不显示弹窗; 如果不设置默认所有activity都可以显示弹窗。
        //设置自定义升级对话框UI布局
        Beta.upgradeDialogLayoutId = R.layout.upgrade_dialog;
        Beta.enableNotification = true;
        //如果你不想在通知栏显示下载进度，你可以将这个接口设置为false，默认值为true。
        //设置Wifi下自动下载
        Beta.autoDownloadOnWifi = false;
        //如果你想在Wifi网络下自动下载，可以将这个接口设置为true，默认值为false。
        //设置是否显示弹窗中的apk信息
        Beta.canShowApkInfo = true;
        //如果你使用我们默认弹窗是会显示apk信息的，如果你不想显示可以将这个接口设置为false。
        /**
         *  如果想监听升级对话框的生命周期事件，可以通过设置OnUILifecycleListener接口
         *  回调参数解释：
         *  context - 当前弹窗上下文对象
         *  view - 升级对话框的根布局视图，可通过这个对象查找指定view控件
         *  upgradeInfo - 升级信息
         */
        Beta.upgradeDialogLifecycleListener = new UILifecycleListener<UpgradeInfo>() {
            @Override
            public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onCreate");
                int screenWidth = ScreenUtils.getScreenWidth(getApplicationContext());
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) (screenWidth * 0.70f), LinearLayout.LayoutParams.WRAP_CONTENT);

                params.gravity = Gravity.CENTER_HORIZONTAL;
                view.findViewById(R.id.ll_content).setLayoutParams(params);
                // 注：可通过这个回调方式获取布局的控件，如果设置了id，可通过findViewById方式获取，如果设置了tag，可以通过findViewWithTag，具体参考下面例子:
                // 通过id方式获取控件，并更改imageview图片
//                ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
//                imageView.setImageResource(R.mipmap.ic_launcher);
//
//                // 通过tag方式获取控件，并更改布局内容
//                TextView textView = (TextView) view.findViewWithTag("textview");
//                textView.setText("my custom text");
            }

            @Override
            public void onStart(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onStart");
            }

            @Override
            public void onResume(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onResume");
            }

            @Override
            public void onPause(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onPause");
            }

            @Override
            public void onStop(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onStop");
            }

            @Override
            public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) {
                Log.d(TAG, "onDestory");
            }
        };
        Bugly.init(this, BUGLY_APP_KEY, false);
    }

    private void initBugly() {
        setStrictMode();
        // 设置是否开启热更新能力，默认为true
        Beta.enableHotfix = true;
        // 设置是否自动下载补丁
        Beta.canAutoDownloadPatch = true;
        // 设置是否提示用户重启
        Beta.canNotifyUserRestart = true;
        // 设置是否自动合成补丁
        Beta.canAutoPatch = true;

        /**
         * 补丁回调接口，可以监听补丁接收、下载、合成的回调
         */
        Beta.betaPatchListener = new BetaPatchListener() {
            @Override
            public void onPatchReceived(String patchFileUrl) {
//                Toast.makeText(getApplicationContext(), patchFileUrl, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDownloadReceived(long savedLength, long totalLength) {
//                Toast.makeText(getApplicationContext(), String.format(Locale.getDefault(),
//                        "%s %d%%",
//                        Beta.strNotificationDownloading,
//                        (int) (totalLength == 0 ? 0 : savedLength * 100 / totalLength)), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDownloadSuccess(String patchFilePath) {
//                Toast.makeText(getApplicationContext(), patchFilePath, Toast.LENGTH_SHORT).show();
//                Beta.applyDownloadedPatch();
            }

            @Override
            public void onDownloadFailure(String msg) {
//                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onApplySuccess(String msg) {
//                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onApplyFailure(String msg) {
//                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPatchRollback() {
//                Toast.makeText(getApplicationContext(), "onPatchRollback", Toast.LENGTH_SHORT).show();
            }
        };

//        long start = System.currentTimeMillis();
        // 这里实现SDK初始化，appId替换成你的在Bugly平台申请的appId,调试时将第三个参数设置为true
//        Bugly.init(getApplicationContext(), APP_ID, true);
//        long end = System.currentTimeMillis();
//        Log.e("init time--->", end - start + "ms");
    }

    @TargetApi(9)
    protected void setStrictMode() {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());
    }
}
